﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "IDbObject.h"
#include "DbDataSchema.h"

namespace gcmp {

    class IExternalData;

    /// \brief 外部数据扩展集合接口
    /// 用于管理用户扩展的外部数据，如ModelLine等；
    /// 通过该接口添加的数据，通过报告计算器，可参与关联更新计算；
    /// 通过该接口添加的数据，可以随着Element一同被拷贝，需要用户正确报告拷贝策略。
    class GCMP_MODEL_INTERFACE_EXPORT IExternalDatas : public IDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IExternalDatas, gcmp::IDbObject)

    public:
        virtual ~IExternalDatas();
    public:
        /// \brief 获取所有的外部数据扩展
        /// 
        /// \return 包含所有外部数据扩展的Vector
        virtual const std::vector<OwnerPtr<IExternalData>>& GetAllExternalDatas() const = 0;

        /// \brief 获取所有的外部数据扩展
        /// 
        /// \return 包含所有外部数据扩展的Vector
        virtual std::vector<OwnerPtr<IExternalData>>& GetAllExternalDatas() = 0;

        /// \brief 将外部数据扩展注册至集合中，重复注册时会报错
        /// 
        /// \param key 外部数据的key值
        /// \param data 外部数据
        /// \return 注册成功返回true，失败（如注册重复数据）返回false
        virtual bool RegisterExternalData(const std::wstring& key, OwnerPtr<IExternalData> externalData) = 0;

        /// \brief 将外部数据扩展从集合中注销
        /// 
        /// \param key 外部数据的key值
        /// \return 注销成功返回true，失败返回false
        virtual bool UnregisterExternalData(const std::wstring& key) = 0;

        /// \brief 从集合中寻找指定数据
        /// 
        /// \param key 数据的key值
        /// \return 找到的外部数据，没找到时返回空指针
        virtual const IExternalData* FindExternalData(const std::wstring& key) const = 0;

        /// \brief 从集合中寻找指定数据
        /// 
        /// \param key 数据的key值
        /// \return 找到的外部数据，没找到时返回空指针
        virtual IExternalData* FindExternalData(const std::wstring& key) = 0;

    };

}// namespace gcmp


